package main

import "fmt"

// 位运算符（二进制相关的,只需要作为了解） 假定 A 为60，B 为13
// A 60   0011 1100
// B 13   0000 1101
func main1() {
	// 0 false 1 true
	var a int = 60
	var b int = 13
	// & 按位与 两个都是真，结果为真
	// 0011 1100
	// 0000 1101
	// ---------
	// 0000 1100
	fmt.Println(a & b) // 60&13 = 12 (二进制转换为10进制的结果)

	// | 按位或 如果都是假的结果才为假0,如果有一个1则为1
	// 0011 1100
	// 0000 1101
	// ---------
	// 0011 1101
	fmt.Println(a | b) // 61

	// ^ 按位异或， 不同则为1.相同就为0
	// 0011 1100
	// 0000 1101
	// ---------
	// 0011 0001
	fmt.Println(a ^ b) // 49

	// &^ 位清空，对于b上的每个数值，如果为0，则取a对应位上的数值;如果为1，则取0.
	// 0011 1100
	// 0000 1101
	// ---------
	// 0011 0000
	fmt.Println(a &^ b) // 48

	// 左移 << n 、右移 >> n 移动的位数
	// 移动完毕后，需要补位（左移补右边，相反一样）
	// 1111 0000
	// 60 -> 240
	fmt.Println(a << 2) // 240

	//     0000 1111
	fmt.Println(a >> 2) // 15
}

/*
下表列出了所有Go语言的赋值运算符。
运算符	描述	实例
=	简单的赋值运算符，将一个表达式的值赋给一个左值	C = A + B 将 A + B 表达式结果赋值给 C
+=	相加后再赋值	C += A 等于 C = C + A
-=	相减后再赋值	C -= A 等于 C = C - A
*=	相乘后再赋值	C *= A 等于 C = C * A
/=	相除后再赋值	C /= A 等于 C = C / A
%=	求余后再赋值	C %= A 等于 C = C % A
<<=	左移后赋值	C <<= 2 等于 C = C << 2
>>=	右移后赋值	C >>= 2 等于 C = C >> 2
&=	按位与后赋值	C &= 2 等于 C = C & 2
^=	按位异或后赋值	C ^= 2 等于 C = C ^ 2
|=	按位或后赋值	C |= 2 等于 C = C | 2
*/

// 赋值运算符
func main() {
	// = 赋值
	var a int = 1
	var c int // 0
	// a = a + b （语法糖）
	c += a // c = c + a
	fmt.Println(c)
	c -= a // c = c - a
	fmt.Println(c)
	c *= a // c = c * a
	fmt.Println(c)
	c /= a // c = c / a
	fmt.Println(c)
	// c = c + a
	// c += a
}

//其他运算符
//运算符	描述	实例
//&	返回变量存储地址	&a; 将给出变量的实际地址。
//*	指针变量。	*a; 是一个指针变量
